#ifndef EASYMSGDEFINE_H
#define EASYMSGDEFINE_H
#include <QString>
#include <assert.h>
namespace EM{
    class EasyMsg;
}
// 定义消息后 一定会经过模板特化，因此调用非特化版本的MsgId意味着没有定义此消息
template <typename _MSG_>
QString MsgId(){
    assert(!("EasyMsg: subscript invalid EasyMsg! use EASY_MSG_DEFINE or EASY_MSG_DEFINE_DETAIL_BEGIN"));
    return "";
}
#define MAKE_MSG_ID_CAT(_MSG_) #_MSG_
#define MSG_ID(_MSG_) MAKE_MSG_ID_CAT(_MSG_)

#define EASY_MSG_DEFINE(_MSG_)              \
    template<>                              \
    QString MsgId<_MSG_>(){                 \
        return MSG_ID(_MSG_);               \
    }                                       \
                                            \
    class _MSG_ : public EM::EasyMsg {          \
    public:                                 \
        QString id() const{                 \
            return MsgId<_MSG_>();          \
        }                                   \
    }

#define EASY_MSG_DEFINE_DETAIL_BEGIN(_MSG_)  \
    template<>                              \
    QString MsgId<_MSG_>(){                 \
        return MSG_ID(_MSG_);               \
    }                                       \
                                            \
    class _MSG_ : public EM::EasyMsg {          \
    public:                                 \
        QString id() const{                 \
            return MsgId<_MSG_>();          \
        }


#define EASY_MSG_DEFINE_DETAIL_END          \
    }

#endif // EASYMSGDEFINE_H
